package xeroxware.framework.dao;

import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.ibatis.session.RowBounds;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.support.SqlSessionDaoSupport;

/**
 * <pre>
 * AbstractDAO
 * </pre>
 * 
 * @since 2012. 12. 26.
 * @author XEROXER
 */
public abstract class AbstractDAO extends SqlSessionDaoSupport {

	@Resource(name = "sqlSession")
	public void setSqlSession(SqlSessionTemplate sqlSessionTemplate) {
		setSqlSessionTemplate(sqlSessionTemplate);
	}

	/**
	 * 리스트 조회 처리 SQL mapping 을 실행한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @return List 형태의 조회결과
	 * @throws Exception
	 */
	public List<Map<String, Object>> selectList(String sqlId) throws Exception {
		return getSqlSession().selectList(sqlId);
	}

	/**
	 * 리스트 조회 처리 SQL mapping 을 실행한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @param parameter
	 *            SQL mapping 입력 데이터를 세팅한 파라메터
	 * @return List 형태의 조회결과
	 * @throws Exception
	 */
	public List<Map<String, Object>> selectList(String sqlId, Object parameter) throws Exception {
		return getSqlSession().selectList(sqlId, parameter);
	}

	/**
	 * 단건 조회 처리 SQL mapping 을 실행한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @return resultType에서 지정한 단일 결과 객체
	 * @throws Exception
	 */
	public Object selectOne(String sqlId) throws Exception {
		return getSqlSession().selectOne(sqlId);
	}

	/**
	 * 단건 조회 처리 SQL mapping 을 실행한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @param parameter
	 *            SQL mapping 입력 데이터를 세팅한 파라메터
	 * @return resultType에서 지정한 단일 결과 객체
	 * @throws Exception
	 */
	public Object selectOne(String sqlId, Object parameter) throws Exception {
		return getSqlSession().selectOne(sqlId, parameter);
	}

	/**
	 * 부분 범위 리스트 조회 처리 SQL mapping 을 실행한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @param pageIndex
	 *            현재 페이지 번호
	 * @param pageSize
	 *            한 페이지 조회 수
	 * @return List 형태의 조회결과
	 * @throws Exception
	 */
	public List<Map<String, Object>> selectListWithPaging(String sqlId, int pageIndex, int pageSize) throws Exception {
		return getSqlSession().selectList(sqlId, new RowBounds((pageIndex - 1) * pageSize, pageSize));
	}

	/**
	 * 부분 범위 리스트 조회 처리 SQL mapping 을 실행한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @param parameter
	 *            SQL mapping 입력 데이터를 세팅한 파라메터
	 * @param pageIndex
	 *            현재 페이지 번호
	 * @param pageSize
	 *            한 페이지 조회 수
	 * @return List 형태의 조회결과
	 * @throws Exception
	 */
	public List<Map<String, Object>> selectListWithPaging(String sqlId, Object parameter, int pageIndex, int pageSize)
			throws Exception {
		return getSqlSession().selectList(sqlId, parameter, new RowBounds((pageIndex - 1) * pageSize, pageSize));
	}

	/**
	 * 입력 처리 SQL mapping 을 실행한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @return insert 처리결과 count
	 * @throws Exception
	 */
	public int insert(String sqlId) throws Exception {
		return getSqlSession().insert(sqlId);
	}

	/**
	 * 입력 처리 SQL mapping 을 실행한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @param parameter
	 *            SQL mapping 입력 데이터를 세팅한 파라메터
	 * @return insert 처리결과 count
	 * @throws Exception
	 */
	public int insert(String sqlId, Object parameter) throws Exception {
		return getSqlSession().insert(sqlId, parameter);
	}

	/**
	 * 수정 처리 SQL mapping 을 실행한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @return update 처리결과 count
	 * @throws Exception
	 */
	public int update(String sqlId) throws Exception {
		return getSqlSession().update(sqlId);
	}

	/**
	 * 수정 처리 SQL mapping 을 실행한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @param parameter
	 *            SQL mapping 입력 데이터를 세팅한 파라메터
	 * @return update 처리결과 count
	 * @throws Exception
	 */
	public int update(String sqlId, Object parameter) throws Exception {
		return getSqlSession().update(sqlId, parameter);
	}

	/**
	 * 삭제 처리 SQL mapping 을 실행한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @return delete 처리결과 count
	 * @throws Exception
	 */
	public int delete(String sqlId) throws Exception {
		return getSqlSession().delete(sqlId);
	}

	/**
	 * 삭제 처리 SQL mapping 을 실행한다.
	 * 
	 * @param sqlId
	 *            SQL mapping 쿼리 ID
	 * @param parameter
	 *            SQL mapping 입력 데이터를 세팅한 파라메터
	 * @return delete 처리결과 count
	 * @throws Exception
	 */
	public int delete(String sqlId, Object parameter) throws Exception {
		return getSqlSession().delete(sqlId, parameter);
	}
}
